/*
 * cluster.h
 *
 *  Created on: 01/10/2011
 *      Author: utn_so
 */

//#include <stdint.h>

#ifndef CLUSTER_H_
#define CLUSTER_H_



/* GLOBAL */


uint32_t EsLibre(struct cluster iClus);  //está
uint32_t CrearColaClusterLibres();  //está
uint32_t NotEndCluster(uint32_t iClus);  //está
struct colaCluster *CrearColaClusterDeEntradasDirectorio (struct cluster *iClus);
uint32_t NotEndCluster(uint32_t iClus);  //está
void RecorrerColaClusterParaCrearListaDeArchivos (struct colaCluster *cola, struct colaArchivos *colaArchivo /*Debe ser inicializada antes*/,struct nodoPilaDirectorio *pila);
uint32_t NotEndCluster(uint32_t iClus);  //está

char EsCarpeta(char *entrada);  //está
char EsArchivo(char *entrada);  //está
char EsLongFileName(char *entrada);  //está
char *leerNombre(char *entrada); //está
char *leerNombreLargo(char *entrada); //está
uint32_t ObtenerClusterDeDirectorio(char *path);


uint32_t UbicacionCarpeta(char *entrada); /*retorna la ubicacion de la entrada de directorio de la carpeta */
char *ObternerCarpetaDeEntradasDeDirectorio(struct colaCluster *cola); /*está*/ //retorna las entradas de 32bytes de toda una carpeta en un puntero (estático)

uint32_t AgregarUnClusterLibreAColaDeCluster(struct colaCluster *cola); /*está*/
uint32_t RemoverUltimoClusterDeColaDeCluster(struct colaCluster *cola); /*está*/
uint32_t RemoverUnClusterDeColaDeCluster(struct colaCluster *cola, uint32_t iClus);/*está*/
char *ObtenerEntradaDeArchivo(char *path, char *nombreLargo, char *esDirectorio);/*está*/
uint32_t cantidadCarpetasDelPath(char *path);/*está*/
uint32_t CantidadDeNodosCola (struct colaCluster *cola);/*está*/

uint32_t obtenerTamanoArchivo(char *entrada);
void EscribirTamano(char *entrada, uint32_t size);
void EscribirEntrada(char *path, char *entrada); /*Solicita el cluster->actualiza la entrada del cluster con la pasada como parámetro -> envía el cluster */
char *ObternerCarpetaDeEntradasDeDirectorio(struct colaCluster *cola);
char EstaBorrado(char *entrada);

char *cambiarNombre (char *entrada, char *nombreNuevo); /* le cambia el nombre a una entrada común de 32 bytes */
void obtenerNombre(char *entrada, char *nombre); /* retorna el nombre del archivo de entrad de 32bytes */
uint32_t tieneExtension(char *nombreCorto); /* comprueba si un archivo 8.3 tiene etensión */
void borrarEntradaArchivo(char *path); /* marca la entrada del archivo como borrada */
void borrarEntradaArchivo_LFN(char *path); /* marca la entrada LFN del archivo como borrada. Marca la entrada comun y la de nombre largo como borradas */

char *ArmarEntradaNombreLargo(char *entradaAnterior, char *nombreNuevo); /* en base a la entrada original de 32 bytes y un nombre (que puede ser LFN o no), arma una entrada LFN con el nuevo nombre */
void *obtenerNombreLargo(char *entrada, char *nombreLargo); /* retorna el nombre del archivo LFN */
void borrarEntradaArchivo_LFN(char *path); /* marca la entrada LFN del archivo como borrada */

void ArmarEntradaNombreCortoNueva(char *entradaCorta, char *nombre, uint32_t posCluster, char atributo);
void CrearEntradaDeSubcarpeta(char *subcarpeta, uint32_t *actual, uint32_t *padre);
uint32_t esCarpetaVacia (uint32_t iClus);
void borrarTodasLasEntradasDeCarpeta(uint32_t iclusCarpeta);
char *obtenerNombreArchivoPath(char *path);
void obtenerParteBajaAltaDeCluster(uint32_t posCluster, uint32_t *alta, uint32_t *baja);

void EscribirPosicion(char *entrada, uint32_t posicion);
void limpiarClusterEnDisco(uint32_t numeroCluster);


#endif /* CLUSTER_H_ */
